import { type anyObj, BASE_URL } from "@/utils/http"

export const getImage = (str: string) => {
	const arr = str.split(",")
	return arr.length > 0 ? BASE_URL + "/" + arr[0] : ""
}

/**
 * 跳转
 * @param url 跳转路径
 * @param data 传递的数据
 */
export const to = (url: string, data?: Object) => {
	uni.navigateTo({
		url: typeof data == "object" ? `/pages/${url}/${url}?data=${JSON.stringify(data)}` : `/pages/${url}/${url}`
	})
}

/**
 * 保留两位小数
 * @param num 需要保留的num
 */
export const toFix = (num: string | number) => {
	const n = Number(num)
	return n.toFixed(2)
}

/**
 * 时间格式转时间戳
 * @param d 日期
 * @returns 时间戳
 */
export const toTimeStamp = (d: string) => {
	let date = new Date()
	if (d) {
		date = new Date(d)
	}
	return date.getTime()
}

/**
 * 时间戳转时间格式
 * @param timestamp 需要转换的时间戳
 * @param lang 默认3
 * @returns lang=3返回年月日 lang=6 返回年月日时分秒 lang=5返回年月日时分 lang=2返回年月
 */
export const timestampToDate = (timestamp: number, lang = 3) => {
	//将时间戳(毫秒)格式转换成年月日时分秒
	if (String(timestamp).length == 10) {
		//秒转毫秒
		timestamp = timestamp * 1000
	}
	const date = new Date(timestamp)
	const Y = date.getFullYear() + "-"
	const M = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-"
	const D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " "

	const h = (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":"
	const m = (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) + ":"
	const s = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()
	if (lang === 6) {
		return Y + M + D + h + m + s
	} else if (lang === 3) {
		return Y + M + D
	} else if (lang === 5) {
		return Y + M + D + h + m
	} else if (lang === 2) {
		return M + D
	}
}

export const strToDate = (str: string) => {
	const date = {
		n: 0,
		y: "",
		r: "",
		s: "",
		f: "",
		m: 0
	}
	str = str.replaceAll("-", "/")
	const d = new Date(str)
	date.n = d.getFullYear()
	date.y = `0${d.getMonth() + 1}`.slice(-2)
	date.r = `0${d.getDate()}`.slice(-2)
	date.s = `0${d.getHours()}`.slice(-2)
	date.f = `0${d.getMinutes()}`.slice(-2)
	date.m = d.getSeconds()
	return date
}

/**
 * 获取7天后日期
 * @returns 7天后的日期
 */
export const getSevenDay = () => {
	// 获取当前时间的毫秒数
	const now = new Date().getTime()

	// 7天的毫秒数
	const sevenDays = 7 * 24 * 60 * 60 * 1000

	// 7天后的毫秒数
	const sevenDaysAgo = now + sevenDays

	// 7天后的日期
	const sevenDaysAgoDate = new Date(sevenDaysAgo)
	return sevenDaysAgoDate.toLocaleDateString().replaceAll("/", "-")
}

/**
 * 判断周几
 * @param data 时间格式
 * @returns 如果目标日期不是今天、明天或后天，则返回星期几
 */
export const getDayDifference = (date: string) => {
	// 创建一个新的Date对象，使用UTC日期来避免时区问题
	const today = new Date()
	const targetDate = new Date(date)

	// 比较两个日期
	if (today.getDate() === targetDate.getDate()) {
		return "今天"
	} else if (today.getDate() + 1 === targetDate.getDate()) {
		return "明天"
	} else if (today.getDate() + 2 === targetDate.getDate()) {
		return "后天"
	} else {
		// 如果目标日期不是今天、明天或后天，则返回星期几
		const arr = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
		return arr[targetDate.getDay()]
	}
}

/**
 * 检查变量是否为空、null或undefined
 * @param value 需要判断的value
 * @returns boolean
 */
export const isEmpty = (value: string) =>  {
	return value === null || value === undefined || value === ""
}

/**
 * 防抖函数
 */
export const debounce = (func: any, wait = 1000, immediate: any) => {
	let timeout: any // 定义一个计时器变量，用于延迟执行函数
	return function (this: any, ...args: any[]) {
		// 返回一个包装后的函数
		// eslint-disable-next-line @typescript-eslint/no-this-alias
		const context = this // 保存函数执行上下文对象
		const later = function () {
			// 定义延迟执行的函数
			timeout = null // 清空计时器变量
			if (!immediate) func.apply(context, args) // 若非立即执行，则调用待防抖函数
		}
		const callNow = immediate && !timeout // 是否立即调用函数的条件
		clearTimeout(timeout) // 清空计时器
		timeout = setTimeout(later, wait) // 创建新的计时器，延迟执行函数
		if (callNow) func.apply(context, args) // 如果满足立即调用条件，则立即执行函数
	}
}

/**
 * 节流函数
 */
export function throttle(func: any, wait: number) {
	let timeout: any // 定义一个计时器变量，用于限制函数调用频率
	return function (this: any, ...args: any[]) {
		// 返回一个包装后的函数
		// eslint-disable-next-line @typescript-eslint/no-this-alias
		const context = this // 保存函数执行上下文对象
		if (!timeout) {
			// 如果计时器不存在
			func.apply(context, args) // 执行函数
			timeout = setTimeout(() => {
				timeout = null // 清空计时器变量
			}, wait) // 创建计时器，在指定时间后重置计时器变量
		}
	}
}

/**
 * 判断字符串某个字符出现的次数
 * @param str 判断的字符串
 * @param char 判断的字符
 * @returns 出现的次数
 */
export function countChar(str: string, char: string) {
	return [...str].reduce((count, ch) => (ch === char ? count + 1 : count), 0)
}

/**
 * 查找一个树形结构数组中元素
 * @param tree 树形结构数组
 * @param target 查找的元素
 * @param n 节点名称
 * @returns 所有找到的元素数组
 */
export function findNodesWithTarget(tree: any[], target: anyObj, n: string) {
	const result: any[] = []

	function traverse(node: anyObj) {
		if (node[n].includes(target)) {
			result.push(node)
		}
		if (node.children) {
			for (const child of node.children) {
				traverse(child)
			}
		}
	}

	for (const node of tree) {
		traverse(node)
	}

	return result
}

/**
 * 判断一个对象数组中，key是否包含某个值
 * @param arr 传入对象数组
 * @param k 查找的key
 * @param target 包含的值
 * @returns boolean
 */
export function isNodesWithTarget(arr: any[], k: any, target: anyObj) {
	for (let i = 0; i < arr.length; i++) {
		if (arr[i][k] === target) {
			return true //存在
		}
	}
	return false //不存在
}
